#!usr/bin/python
# -*- coding:utf-8 -*-

"""
该 py 文件用于对 status_water_xxx 数据 进行每日定时处理。
这是因为 status_water_xxx 数据每日均会添加
这里，我们设定每天早上 7 点对前一天数据进行处理（此时处理的前一天数据至前一天下午4点，因此前一天数据不完整）

这里使用简单的定时处理方法，可能会比较耗内存。
并将该 py 文件放入 229 服务器后台运行
"""
import time
import pymysql
import datetime

while True:
    # 这里设置每天数据条数处理时间
    time_now = time.strftime("%H:%M", time.localtime())
    if time_now == "07:00":
        # print("到达指定时间")
        conn = pymysql.connect(host='xx.x.xx.226', port=3306, user='root', passwd='xxx', db='wolf', charset='utf8')
        cur = conn.cursor()

        # 获取要处理的表名称
        time_day_last = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime("%Y%m%d")
        table_name_day_last = "status_water_" + str(time_day_last)

        input_conn = pymysql.connect(host='xx.x.xx.229', port=3306, user='root', passwd='xxx', db='gprs', charset='utf8')
        input_cursor = input_conn.cursor()

        # 执行插入语句
        sql = "INSERT INTO day_value(unitId, imei, linkerId, log_time, status_value) VALUES (%s,%s,%s,%s,%s)"

        # 将前一天的 status_water_xxx 数据批量写入 gprs.day_value 中
        select_sql2 = "select sw.id as unitId, substring_index(linker.iuid,'-',-1) as imei, linker.id as linkerId, \
                    substring_index(sw.transfer_time, ' ', 1) as log_time,count(sw.id) as status_value \
                        from {key} sw, \
                        iot_unit unit, \
                        iot_linker linker \
                        where \
                        sw.id=unit.id and unit.linker_id=linker.id group by substring_index(linker.iuid,'-',-1), substring_index(sw.transfer_time,' ',1);".format(
                        key=table_name_day_last)
        cur.execute(select_sql2)
        result = cur.fetchall()

        try:
            input_cursor.executemany(sql, result)
            input_conn.commit()
        except Exception as e:
            # 有异常，回滚事务
            input_conn.rollback()
        # print("数据插入成功")

        # 对 imei 进行处理，实现更新操作，获取合理的 imei 号
        imei_correct = "update day_value set imei = replace(imei, imei, substring(imei, -16, 15)) where length(imei) > 15;"
        input_cursor.execute(imei_correct)
        input_conn.commit()                 # update完成后需要commit

        # 对原来的 day_value_update 表进行清空再插入操作，这是因为每天统计数据至当天下午 4时，下一天包含当天数据，否则需要在 day_value_update 中再执行累加操作
        # 当前机组数量较少，所以可以这样操作，当数据量较多时，该方法可能比较局限，需改进。
        sql_delete = "delete from day_value_update"
        input_cursor.execute(sql_delete)

        sql_hebing = """
            insert into day_value_update (unitId, imei, linkerId, status_value, log_time)
            select unitId, imei, linkerId, sum(status_value), log_time from day_value group by unitId, imei, linkerId, log_time;
        """
        input_cursor.execute(sql_hebing)
        input_conn.commit()
        # print("数据合并成功")

        input_cursor.close()
        input_conn.close()
        cur.close()
        conn.close()

        time.sleep(61)       # 因为是以分钟定时，所以暂停 61s，使之不会在 1 min 内执行多次

